<?php
use phpseclib3\Net\SFTP;
//* 使用sfpt同步项目文件
class release{
    private $sftp;
    private $ip;
    private $user;
    private $pwd;
    
    public $local_path;
    public $remote_path;
    public function __construct($ip,$user,$pwd){
        $this->ip = $ip;
        $this->user = $user;
        $this->pwd = $pwd;
        $this->sftp = new SFTP($ip, 22);
        if (!$this->sftp->login($user, $pwd)) {
            exit('Login Failed');
        }
    }

    // * 创建目录
    public function create_dir($dir){
        if(!$this->sftp->is_dir($dir)){
            $this->sftp->exec('sudo mkdir -p '.$dir.' && sudo chmod 777 '.$dir);
            return true;
        }
        return false;
    }
    
    // * 拷贝文件
    public function copy_dir($local_dir, $remote_dir){
        [$f,$d]=$this->get_file_dir($local_dir);
        // * 创建远端目录
        echo "创建远端目录：\n";
        foreach ($d as $dpath) {
            // * 远端目录构建
            $remote=str_replace($local_dir, $remote_dir, $dpath);
            if(!$this->create_dir($remote)){
                echo "创建：{$remote} NG,文件已经存在\n";
            }
            echo "创建：{$remote} OK\n";
        }
        // * 拷贝远程
        echo "拷贝文件到远端：\n";
        foreach ($f as $fpath) {
            // * 远端文件构建
            $remote=str_replace($local_dir, $remote_dir, $fpath);
            if(!$this->sftp->put($remote, $fpath,SFTP::SOURCE_LOCAL_FILE)){
                echo "拷贝：{$remote} NG\n";
                continue;
            }
            echo "拷贝：{$remote} OK\n";
        }
    }
    
    // * 本地目录遍历，获得所有文件路径，返回文件数组和目录数组
    public function get_file_dir($dir){
        $file_list = array();
        $dir_list = array($dir);
        //目录，遍历获得文件
        foreach(scandir($dir) as $file){
            if($file=="." || $file==".."){
                continue;
            }
            $file_path = $dir."/".$file;
            if(is_file($file_path)){
                $file_list[] = $file_path;
            }else{
                [$f,$d] = $this->get_file_dir($file_path);
                $file_list = array_merge($file_list,$f);
                $dir_list = array_merge($dir_list,$d);
            }
        }
        return [$file_list,$dir_list];
    }
}
?>